package com.ycd.filters;

import com.alibaba.fastjson.JSON;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

/** 做测试
 * - 定义一个自定义的前置Filter，用于在Zuul网关层做登录拦截
 * - 如果请求头中包含Token，那么放行
 * - 如果请求头中不包含Token，那么拦截，并返回提示信息
 * - 第一步：继承ZuulFilter，实现自定义拦截器
 */
@Component // 必须交给spring管理，否则不能生效
public class TestLoginFilter extends ZuulFilter {
    // 前置拦截可以通过父类查看返回值信息示例
    @Override
    public String filterType() {
        return "pre";
    }

    // filterOrder执行时机，数字越小越先执行，不要负数
    @Override
    public int filterOrder() {
        return 0;
    }

    // 这个方法，用来判断是否需要执行目标业务方法-返回true执行run方法；返回false：不执行
    @Override
    public boolean shouldFilter() {
        // 1.获取上下文地址
        RequestContext currentContext = RequestContext.getCurrentContext();
        String uri = currentContext.getRequest().getRequestURI();
        // 2.判断请求路径是否以login/register结尾
        if (StringUtils.endsWithIgnoreCase(uri,"login") || StringUtils.endsWithIgnoreCase(uri,"register")){
            // 如果有就返回false结束
            return false;
        }
        // 如果没有就返回true执行下面run方法
        return true;
    }
    // 此自定义filter的核心业务方法执行目标
    @Override
    public Object run() throws ZuulException {
        // 1.获取到请求头，响应头
        String token = RequestContext.getCurrentContext().getRequest().getHeader("token");
        HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
        // 设置响应数据的格式和编码
        response.setContentType("application/json;charset=utf-8");
        // 2.判断是否包含token是否为空，如果不包含，那么需要阻止执行后面的filter，并且还要返回错误信息
        if (StringUtils.isEmpty(token)){
            try {
                // 定义返回的错误信息
                HashMap<Object, Object> map = new HashMap<>();
                map.put("success", false);
                map.put("message", "noLogin,拒绝登录");
                // 为空设置响应的内容
                PrintWriter writer = response.getWriter();
                // 项目5：response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
                String jsonString = JSON.toJSONString(map);
                writer.write(jsonString);
                // 2.阻止后续filter执行
                RequestContext.getCurrentContext().setSendZuulResponse(false);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 如果要放行，这里返回null即可，不用管
        return null;
    }
}
